{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "P20Z1RhWhPzX"
      },
      "source": [
        "##### Copyright 2018 The TensorFlow Probability Authors.\n",
        "\n",
        "Licensed under the Apache License, Version 2.0 (the \"License\");"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "cellView": "form",
        "colab": {},
        "colab_type": "code",
        "id": "qS8MroChhSxR"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "0ufLLTrrPIhi"
      },
      "source": [
        "# Probabilistic PCA\n",
        "\n",
        "\u003ctable class=\"tfo-notebook-buttons\" align=\"left\"\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca target=\"_blank\" href=\"https://www.tensorflow.org/probability/examples/Probabilistic_PCA\"\u003e\u003cimg src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" /\u003eView on TensorFlow.org\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Probabilistic_PCA.ipynb\"\u003e\u003cimg src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" /\u003eRun in Google Colab\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca target=\"_blank\" href=\"https://github.com/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Probabilistic_PCA.ipynb\"\u003e\u003cimg src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" /\u003eView source on GitHub\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca href=\"https://storage.googleapis.com/tensorflow_docs/probability/tensorflow_probability/examples/jupyter_notebooks/Probabilistic_PCA.ipynb\"\u003e\u003cimg src=\"https://www.tensorflow.org/images/download_logo_32px.png\" /\u003eDownload notebook\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "\u003c/table\u003e"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "Py-bl6M32ZXY"
      },
      "source": [
        "Probabilistic principal components analysis (PCA) is a\n",
        "dimensionality reduction technique that\n",
        "analyzes data via a lower dimensional latent space\n",
        "([Tipping and Bishop 1999](#1)). It is often\n",
        "used when there are missing values in the data or for multidimensional\n",
        "scaling."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "WHNNrlLNPbpA"
      },
      "source": [
        "## Imports"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "mbM5dCFdUior"
      },
      "outputs": [],
      "source": [
        "import functools\n",
        "import warnings\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "import seaborn as sns\n",
        "\n",
        "import tensorflow.compat.v2 as tf\n",
        "import tensorflow_probability as tfp\n",
        "\n",
        "from tensorflow_probability import distributions as tfd\n",
        "\n",
        "tf.enable_v2_behavior()\n",
        "\n",
        "plt.style.use(\"ggplot\")\n",
        "warnings.filterwarnings('ignore')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "QjIXsU55eq-d"
      },
      "source": [
        "## The Model\n",
        "\n",
        "Consider a data set $\\mathbf{X} = \\{\\mathbf{x}_n\\}$ of $N$ data\n",
        "points, where each data point is $D$-dimensional, $\\mathbf{x}_n \\in\n",
        "\\mathbb{R}^D$. We aim to represent each $\\mathbf{x}_n$ under a latent\n",
        "variable $\\mathbf{z}_n \\in \\mathbb{R}^K$ with lower dimension, $K \u003c\n",
        "D$. The set of principal axes $\\mathbf{W}$ relates the latent variables to\n",
        "the data.\n",
        "\n",
        "Specifically, we assume that each latent variable is normally distributed,\n",
        "\n",
        "\\begin{equation*}\n",
        "\\mathbf{z}_n \\sim N(\\mathbf{0}, \\mathbf{I}).\n",
        "\\end{equation*}\n",
        "\n",
        "The corresponding data point is generated via a projection,\n",
        "\n",
        "\\begin{equation*}\n",
        "\\mathbf{x}_n \\mid \\mathbf{z}_n\n",
        "\\sim N(\\mathbf{W}\\mathbf{z}_n, \\sigma^2\\mathbf{I}),\n",
        "\\end{equation*}\n",
        "\n",
        "where the matrix $\\mathbf{W}\\in\\mathbb{R}^{D\\times K}$ are known as\n",
        "the principal axes. In probabilistic PCA, we are typically interested in\n",
        "estimating the principal axes $\\mathbf{W}$ and the noise term\n",
        "$\\sigma^2$.\n",
        "\n",
        "Probabilistic PCA generalizes classical PCA. Marginalizing out the the\n",
        "latent variable, the distribution of each data point is\n",
        "\n",
        "\\begin{equation*}\n",
        "\\mathbf{x}_n \\sim N(\\mathbf{0}, \\mathbf{W}\\mathbf{W}^\\top + \\sigma^2\\mathbf{I}).\n",
        "\\end{equation*}\n",
        "\n",
        "Classical PCA is the specific case of probabilistic PCA when the\n",
        "covariance of the noise becomes infinitesimally small, $\\sigma^2 \\to 0$.\n",
        "\n",
        "We set up our model below. In our analysis, we assume $\\sigma$ is known, and\n",
        "instead of point estimating $\\mathbf{W}$ as a model parameter, we\n",
        "place a prior over it in order to infer a distribution over principal\n",
        "axes. We'll express the model as a TFP JointDistribution, specifically, we'll\n",
        "use [JointDistributionCoroutine](https://www.tensorflow.org/probability/api_docs/python/tfp/distributions/JointDistributionCoroutine)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "Gwc6maZifKnb"
      },
      "outputs": [],
      "source": [
        "Root = tfd.JointDistributionCoroutine.Root\n",
        "def probabilistic_pca(data_dim, latent_dim, num_datapoints, stddv_datapoints):\n",
        "  w = yield Root(tfd.Independent(\n",
        "      tfd.Normal(loc=tf.zeros([data_dim, latent_dim]),\n",
        "                 scale=2.0 * tf.ones([data_dim, latent_dim]),\n",
        "                 name=\"w\"), reinterpreted_batch_ndims=2))\n",
        "  z = yield Root(tfd.Independent(\n",
        "      tfd.Normal(loc=tf.zeros([latent_dim, num_datapoints]),\n",
        "                 scale=tf.ones([latent_dim, num_datapoints]),\n",
        "                 name=\"z\"), reinterpreted_batch_ndims=2))\n",
        "  x = yield tfd.Independent(tfd.Normal(\n",
        "      loc=tf.matmul(w, z),\n",
        "      scale=stddv_datapoints,\n",
        "      name=\"x\"), reinterpreted_batch_ndims=2)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "2whVRGHPdXNm"
      },
      "outputs": [],
      "source": [
        "num_datapoints = 5000\n",
        "data_dim = 2\n",
        "latent_dim = 1\n",
        "stddv_datapoints = 0.5\n",
        "\n",
        "concrete_ppca_model = functools.partial(probabilistic_pca,\n",
        "    data_dim=data_dim,\n",
        "    latent_dim=latent_dim,\n",
        "    num_datapoints=num_datapoints,\n",
        "    stddv_datapoints=stddv_datapoints)\n",
        "\n",
        "model = tfd.JointDistributionCoroutine(concrete_ppca_model)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "x2zF-wrTVSK4"
      },
      "source": [
        "## The Data"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "n4HYhXlTVZ1_"
      },
      "source": [
        "We can use the model to generate data by sampling from the joint prior distribution."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 85
        },
        "colab_type": "code",
        "id": "b23iIkX8VVyn",
        "outputId": "ddcfa310-060b-4945-93ae-4bdad421d95d"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Principal axes:\n",
            "tf.Tensor(\n",
            "[[-2.3960476]\n",
            " [-2.0121093]], shape=(2, 1), dtype=float32)\n"
          ]
        }
      ],
      "source": [
        "actual_w, actual_z, x_train = model.sample()\n",
        "\n",
        "print(\"Principal axes:\")\n",
        "print(actual_w)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "O2ZdIFz7VuSO"
      },
      "source": [
        "We visualize the dataset."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 290
        },
        "colab_type": "code",
        "id": "ubJJvk0KVyVW",
        "outputId": "caf4bde1-82ea-42ff-e61b-1e9a2ca2d760"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nW4cxhjlz5rBy5UqysrImuqRR6bqOnTGGF198kYULF57x9ZywUBivLbnH6lTrHM3KlSspKCgA4JVX\nXuEHP/gB69evP+FrJqLOiXKymsfz+p2tHnroIUKhELFYjF/96lc88cQT3H777RNd1pQ3Wa/rE088\nQWZmJkuXLmXv3r1n9B4TFgrjtSX3eNR5PIkPNIBPf/rT/PrXv6a9vZ2ioqJklDbMWOocz+t5tJPV\nPJ7X73QUFRURiUS8AHMch46ODgoLCye0rtGEQiEA/H4/ixcv5tFHH53gio5P13VsnnzySZqbm/nO\nd74DnPn1nLRjCm+88Qb/9m//xr333jviQ2DRokW89NJLgDtbYe/evVxyySUTUeYwx/YzHj0O8vbb\nb2PbtveXaSIdW+dkvZ6T9frl5uYyffp0tm7dCsDWrVupqqqadF0cAwMD9PX1eT9v27aN8847bwIr\nGl3i76Ou65l7+umnqaur41vf+hY+nw848+s5aVc033LLLQQCAXJzc0dsyT0wMEBNTQ379u3D5/Px\nla98hU984hMTUue2bdt46qmniEaj+P1+0tPTue+++6ioqOChhx6iu7sbgKysLK6//nrOP//8SVfn\nZLqeR5tM1+9YDQ0N1NTUEI1GCQaDrF69mvLy8okua5iWlhbWrl2L4zg4jkNlZSU33XQT+fn5E10a\nv/zlL3n99dfp7OwkNzeX7Oxs1q5dO+mu62h1rlmzZlJd1/r6eu6++27C4TCBQABw71j5zW9+84yu\n56QNBRERGX+TtvtIRETGn0JBREQ8CgUREfEoFERExKNQEBERj0JBREQ8CgUREfEoFERExPP/AbW0\nl/wMg6eBAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x2fa8fc068450\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "plt.scatter(x_train[0, :], x_train[1, :], color='blue', alpha=0.1)\n",
        "plt.axis([-20, 20, -20, 20])\n",
        "plt.title(\"Data set\")\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "qIZepLMgItfq"
      },
      "source": [
        "## Maximum a Posteriori Inference\n",
        "\n",
        "We first search for the point estimate of latent variables that maximizes the posterior probability density. This is known as maximum a posteriori (MAP) inference, and is done by calculating the values of $\\mathbf{W}$ and $\\mathbf{Z}$ that maximise the posterior density $p(\\mathbf{W}, \\mathbf{Z} \\mid \\mathbf{X}) \\propto p(\\mathbf{W}, \\mathbf{Z}, \\mathbf{X})$.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "s2AvQAYqIh6K"
      },
      "outputs": [],
      "source": [
        "w = tf.Variable(np.ones([data_dim, latent_dim]), dtype=tf.float32)\n",
        "z = tf.Variable(np.ones([latent_dim, num_datapoints]), dtype=tf.float32)\n",
        "\n",
        "target_log_prob_fn = lambda w, z: model.log_prob((w, z, x_train))\n",
        "losses = tfp.math.minimize(lambda: -target_log_prob_fn(w, z),\n",
        "                           optimizer=tf.optimizers.Adam(learning_rate=0.05),\n",
        "                           num_steps=200)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 296
        },
        "colab_type": "code",
        "id": "ya-XoAtpY474",
        "outputId": "8a5aa23b-29c7-412a-e9be-1981124afbef"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[\u003cmatplotlib.lines.Line2D at 0x2fa8e79b1b90\u003e]"
            ]
          },
          "execution_count": 0,
          "metadata": {
            "tags": []
          },
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n/j+ICL17IihbugAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x2fa8e85a6490\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "plt.plot(losses)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "TqTuhkTsP90b"
      },
      "source": [
        "We can use the model to sample data for the inferred values for $\\mathbf{W}$ and $\\mathbf{Z}$, and compare to the actual dataset we conditioned on."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 347
        },
        "colab_type": "code",
        "id": "T3O6PHe3XX8a",
        "outputId": "f96414fa-7c1f-48de-cc89-24ef1f619e66"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "MAP-estimated axes:\n",
            "\u003ctf.Variable 'Variable:0' shape=(2, 1) dtype=float32, numpy=\n",
            "array([[2.7477396],\n",
            "       [2.318143 ]], dtype=float32)\u003e\n"
          ]
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x2fa8e7b1a290\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "print(\"MAP-estimated axes:\")\n",
        "print(w)\n",
        "\n",
        "_, _, x_generated = model.sample(value=(w, z, None))\n",
        "\n",
        "plt.scatter(x_train[0, :], x_train[1, :], color='blue', alpha=0.1, label='Actual data')\n",
        "plt.scatter(x_generated[0, :], x_generated[1, :], color='red', alpha=0.1, label='Simulated data (MAP)')\n",
        "plt.legend()\n",
        "plt.axis([-20, 20, -20, 20])\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "YdtvGLvmg341"
      },
      "source": [
        "## Variational Inference\n",
        "\n",
        "MAP can be used to find the mode (or one of the modes) of the posterior distribution, but does not provide any other insights about it. We next use variational inference, where the posterior distribtion $p(\\mathbf{W}, \\mathbf{Z} \\mid \\mathbf{X})$ is approximated using a variational distribution $q(\\mathbf{W}, \\mathbf{Z})$ parametrised by $\\boldsymbol{\\lambda}$. The aim is to find the variational parameters $\\boldsymbol{\\lambda}$ that _minimize_ the KL divergence between q and the posterior, $\\mathrm{KL}(q(\\mathbf{W}, \\mathbf{Z}) \\mid\\mid p(\\mathbf{W}, \\mathbf{Z} \\mid \\mathbf{X}))$, or equivalently, that _maximize_ the evidence lower bound, $\\mathbb{E}_{q(\\mathbf{W},\\mathbf{Z};\\boldsymbol{\\lambda})}\\left[ \\log p(\\mathbf{W},\\mathbf{Z},\\mathbf{X}) - \\log q(\\mathbf{W},\\mathbf{Z}; \\boldsymbol{\\lambda}) \\right]$.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "BfXGOtI9g7bG"
      },
      "outputs": [],
      "source": [
        "qw_mean = tf.Variable(np.ones([data_dim, latent_dim]), dtype=tf.float32)\n",
        "qz_mean = tf.Variable(np.ones([latent_dim, num_datapoints]), dtype=tf.float32)\n",
        "qw_stddv = tf.nn.softplus(tf.Variable(-4 * np.ones([data_dim, latent_dim]), dtype=tf.float32))\n",
        "qz_stddv = tf.nn.softplus(tf.Variable(-4 * np.ones([latent_dim, num_datapoints]), dtype=tf.float32))\n",
        "def factored_normal_variational_model():\n",
        "  qw = yield Root(tfd.Independent(tfd.Normal(\n",
        "      loc=qw_mean, scale=qw_stddv, name=\"qw\"), reinterpreted_batch_ndims=2))\n",
        "  qz = yield Root(tfd.Independent(tfd.Normal(\n",
        "      loc=qz_mean, scale=qz_stddv, name=\"qz\"), reinterpreted_batch_ndims=2))\n",
        "\n",
        "surrogate_posterior = tfd.JointDistributionCoroutine(\n",
        "    factored_normal_variational_model)\n",
        "\n",
        "losses = tfp.vi.fit_surrogate_posterior(\n",
        "    target_log_prob_fn,\n",
        "    surrogate_posterior=surrogate_posterior,\n",
        "    optimizer=tf.optimizers.Adam(learning_rate=0.05),\n",
        "    num_steps=200)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 415
        },
        "colab_type": "code",
        "id": "iTmklbFhdHiV",
        "outputId": "f90a1949-3867-42a8-970e-f1158f081f03"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Inferred axes:\n",
            "\u003ctf.Variable 'Variable:0' shape=(2, 1) dtype=float32, numpy=\n",
            "array([[2.7373285],\n",
            "       [2.303713 ]], dtype=float32)\u003e\n",
            "Standard Deviation:\n",
            "tf.Tensor(\n",
            "[[0.01814996]\n",
            " [0.01814996]], shape=(2, 1), dtype=float32)\n"
          ]
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZsAAAEGCAYAAACzYDhlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X98XHWd7/HXd/K7kwnN5EeTIUoClJbyU4QixJboxZg1\nruBjawoWvasX63UTHrussNRF9wJe7opsliLN4jbbrRhRCFHRtSr4EwhIqyiCRaiFYaUkNM2vJpnS\nNMn53j9OGyiTNr/O5CQz7+fjMY8m3++cyWc+nZz3fM9M5hhrrUVERCSBAn4XICIiyU9hIyIiCaew\nERGRhFPYiIhIwilsREQk4VImbGKxGK2trcRiMb9LSQrqp7fUT++ol97yqp/pk12hpaWF7du3s2/f\nPhobGykrKwNgZGSEe+65h2effZbMzEyWLl3K+vXrAejs7KSpqYmhoSFCoRD19fWUlJQkbG4qYrEY\nbW1tVFVVEQwGp9cliaN+ekv99I566S2v+jnpymblypXccsstFBUVHTXe0tJCZmYmd955J7fffjtX\nXHHF+FxzczM1NTVs3LiR6upqNm/enNA5ERGZ3yYNm2XLlhEOh3nz334ePHiQxx57jLVr146P5eXl\nATAwMEA0GqWyshKAyspKotEog4ODCZkTEZH5b9LDaBPZu3cvubm5PPDAA+zcuZPs7GzWrl3L8uXL\n6e7uJhwOY4wBIBAIkJ+fT09PD47jeD4XCoW86IOIiCTQjMJmbGyMrq4uTj75ZK666ip2797Nbbfd\nxl133eV1fTMSi8XiXszq6enxqRoRkYVvon1oMBic8us4MwqboqIi0tLSuPjiiwE49dRTCYVCdHR0\nUFhYSG9vL9ZajDE4jkNfXx8FBQVYaz2fm8i2bdtoa2uLG29tbZ3J3ZUJFBcXq58eUj+9o15660g/\n6+rq4ubWrFkz4fhEphU2R163CYVCnHHGGTzzzDOcffbZdHR0MDAwQElJCYsWLaK8vJz29nZWrVpF\ne3s7FRUV44e7EjH3VrW1tVRVVU0419HRMZ27LMcRiUTUTw+pn95RL70ViUTYtGlT3Ph03p1mJvvU\n561bt7Jjxw76+/vJy8sjNzeXxsZGurq6uPvuuxkcHCQ9PZ0rr7ySc845B3B36E1NTcRiMYLBIA0N\nDZSWliZsbjr0APSOfqG9pX56R730ViQSmfVtTBo2yUYPQO/oF9pb6qd31EtveRE2KfMJAiIi4h+F\njYiIJJzCRkREEk5hIyIiCaewERGRhFPYiIhIwilsREQk4RQ2IiKScAobERFJOIWNiIgknMJGREQS\nTmEjIiIJp7AREZGEU9iIiEjCKWxERCThFDYiIpJwChsREUk4hY2IiCRcyoWNHRvzuwQRkZSTcmFD\n916/KxARSTmpFzYdf/a7AhGRlJNyYWMVNiIicy7lwoaOV/yuQEQk5aRPdoWWlha2b9/Ovn37aGxs\npKys7Kj5Bx54gLa2tqPmOjs7aWpqYmhoiFAoRH19PSUlJQmbmw6tbERE5t6kK5uVK1dyyy23UFRU\nFDcXjUbZvXs3hYWFR403NzdTU1PDxo0bqa6uZvPmzQmdm5bX9mAdvSNNRGQuTRo2y5YtIxwOY609\nanx0dJQtW7Zw9dVXHzU+MDBANBqlsrISgMrKSqLRKIODgwmZm7bREdind6SJiMylSQ+jHcv999/P\n6tWr41Y83d3dhMNhjDEABAIB8vPz6enpwXEcz+dCoVBcbbFYjFgsFjdeXFzsftHxZ1gSmeldFxFJ\nOV1dXXFjwWCQYDA4pe1nFDa7du3ixRdfZN26dTPZPOG2bdtGW1tb3HhraysAoaF+8iIKGy9E1EdP\nqZ/eUS+91dDQEDe2Zs0a6urqprT9jMLmueeeo6Ojg4aGBqy19Pb2cuutt/KZz3yG8vJyent7sdZi\njMFxHPr6+igoKBi/rpdzE6mtraWqqmri4guK2b/zaYY6OmZy1+VNIpEIHeqjZ9RP76iX3opEImza\ntClufKqrGphh2Fx++eVcfvnl49/X19fzuc99bvzdaOXl5bS3t7Nq1Sra29upqKgYP9yViLmJGnCs\nJpjTzsA++xus42ACqffObxGRmRh/GWKGjH3rK/9vsXXrVnbs2EF/fz95eXnk5ubS2Nh41HUaGhrY\nsGHDeNh0dHTQ1NRELBYjGAzS0NBAaWlpwuamY0/bN7BbNxL4wkbM20+e9vbyBj179Jb66R310lte\nHJKcNGySzat/eAbnhk9iPvIJAtUf9rucBU2/0N5SP72jXnrLi7BJueNIJlwIS07EPv+s36WIiKSM\nlAsbAHP62bBrJ3Z01O9SRERSQmqGzfJzYPh1eHmX36WIiKSElAwblq4AwL70gs+FiIikhpQMG5O3\nGAqK4eXdfpciIpISUjJsACg/FRvVYTQRkbmQsmFjKk6D7r3Ywf1+lyIikvRSN2zKT3O/ePlPvtYh\nIpIKUjZsOOkUMAFsVGEjIpJoKRs2JjsHSsuwWtmIiCRcyoYNgKlYCtFdcSeGExERb6V02HDqChga\ngM5X/K5ERCSppXTYmGVnAWCff8bnSkREkltqh01RCRQUY1/Qh3KKiCRSSocNgFl+FrzwB6zj+F2K\niEjSSvmwYfnZEBuEPS/7XYmISNJK+bAxy84G9LqNiEgiKWzyC6DkROzO3/pdiohI0kr5sAEw574L\nXngWGxvyuxQRkaSksAHMeRfB2Bj299v9LkVEJCkpbADKl0K4EPvbX/ldiYhIUlLYAMYYzDsugp2/\nwx484Hc5IiJJR2FzmDnvIhgdwf7+136XIiKSdNInu0JLSwvbt29n3759NDY2UlZWxtDQEHfddRdd\nXV2kp6dTUlLC+vXrCYVCAHR2dtLU1MTQ0BChUIj6+npKSkoSNueJU1e4h9Ke/AVceIl3tysiIpOv\nbFauXMktt9xCUVHRUeOXXXYZd9xxB7fffjtLlizh3nvvHZ9rbm6mpqaGjRs3Ul1dzebNmxM65wUT\nCGAurIKdT2P393l62yIiqW7SsFm2bBnhcPioj+HPzc1lxYoV498vXbqU7u5uAAYGBohGo1RWVgJQ\nWVlJNBplcHAwIXNeMhe9B6yD3fGop7crIpLqJj2MNhlrLQ8//DAXXHABAN3d3YTDYYwxAAQCAfLz\n8+np6cFxHM/njhy6e7NYLEYsFosbLy4uPu59MaVvg5NOxT7xc3jfZTNviohIkunq6oobCwaDBIPB\nKW0/67DZsmULOTk51NTUzPamPLNt2zba2trixltbW4lEIsfddvADf0X/3bdRMNBD1vKzElVi0pis\nnzI96qd31EtvNTQ0xI2tWbOGurq6KW0/q7BpaWlh7969bNiwYXyssLCQ3t5erLUYY3Ach76+PgoK\nCrDWej43kdraWqqqqiac6+joOO59sivOg5wg++77TwLrr59xb1JBJBKZtJ8ydeqnd9RLb0UiETZt\n2hQ3PtVVDczirc/f+ta3iEajXH/99aSlpY2P5+XlUV5eTnt7OwDt7e1UVFQQCoUSMjeRYDBIcXFx\n3GUqTHYOZtX7sE89ju3dN9P2iIgklYn2qdMJG2Pf/Mr/BLZu3cqOHTvo7+8nLy+P3Nxcrr32Wj77\n2c8SiUTIyMgYL+S6664D3NVDU1MTsViMYDBIQ0MDpaWlCZubjqk827Hde3H+8dOY6ssIrPnEtH9G\nqtCzR2+pn95RL73lxSHJScMm2Uz1Aeg0/wv26e0Ebv13zOJwgqtamPQL7S310zvqpbe8CBt9gsAx\nmMs+CmOj2G33+12KiMiCp7A5BlMcwax6P/axh7F79QxJRGQ2FDbHYT64FtIzcVq3+F2KiMiCprA5\nDnNCPuYv18Izv8Y++xu/yxERWbAUNpMw/+MvYcmJOPc1Yw8N+12OiMiCpLCZhEnPIPDRT0NXJ/Z7\n906+gYiIxFHYTIFZcS7mkhrsT76H/dNzfpcjIrLgKGymyKz5BBQuwbn7n7Gv7fG7HBGRBUVhM0Um\nO4fANf8EgNP4BX2UjYjINChspsGUlhH4+y/C6zGcbzX7XY6IyIKhsJkmU1aO+cBH4OknsTt/53c5\nIiILgsJmBsz7LoeiEpxv/jt232t+lyMiMu8pbGbAZGQQ+HgDDPbj3HQNzhM/87skEZF5TWEzQ2b5\n2QRuugsqTsNuvRPniZ/7XZKIyLylsJkFEy4i8Lf/B04/B/u1r2Cf02s4IiITUdjMksnIJFB/IxSX\n4nxzM3Z0xO+SRETmHYWNB0xWNoG1/wv2vor92Q/8LkdEZN5R2HjEnHU+nHU+9gf3Yff3+V2OiMi8\norDxUGDt1TAygv3O1/0uRURkXlHYeMgsiWAu/RD2iZ9hX3rB73JEROYNhY3HzAfr4IR89/w31vpd\njojIvKCw8ZjJXoT58Mcgugv768f8LkdEZF5Q2CSAueg9UFaB/c7XsSOH/C5HRMR36ZNdoaWlhe3b\nt7Nv3z4aGxspKysDoLOzk6amJoaGhgiFQtTX11NSUuLL3HxjAmkE6j6J869fwG5rxVx+ld8liYj4\natKVzcqVK7nlllsoKio6ary5uZmamho2btxIdXU1mzdv9m1uPjKnn4O56L3YH7Zhd+vsniKS2iYN\nm2XLlhEOh496sXtgYIBoNEplZSUAlZWVRKNRBgcH53xuPjNXroeCIpz/+Ffs8EG/yxER8c2kh9Em\n0t3dTTgcxhgDQCAQID8/n56eHhzHmdO5UCgUV18sFiMWi8WNFxcXz+TuzpjJWUTgE3+Lc/s/Yn/y\nIOaDV8zpzxcR8UpXV1fcWDAYJBgMTmn7GYXNfLdt2zba2trixltbW4lEInNbTCRC9xM/5eBD32XJ\nmo+TFi6c25+fYHPezySnfnpHvfRWQ0ND3NiaNWuoq6ub0vYzCpvCwkJ6e3ux1mKMwXEc+vr6KCgo\nwFo7p3MTqa2tpaqqasK5jo6OmdzlWbEfqMM++QidzXcQ+Fj9nP/8RIlEIr70M1mpn95RL70ViUTY\ntGlT3PhUVzUwzbc+H3ndJi8vj/Lyctrb2wFob2+noqKCUCg053MTCQaDFBcXx138YoojmNXvxz7+\nU2zPPt/qEBGZqYn2qdMJG2Mn+TP3rVu3smPHDvr7+8nLyyM3N5fGxkY6OjpoamoiFosRDAZpaGig\ntLQUYM7npsOvZzu2Zx/Ojesxq2sIfPTTvtTgNT179Jb66R310lteHJKcNGySjZ8PQOdrX8HueJTA\nl5oxefm+1eEV/UJ7S/30jnrpLS/CRp8gMIfMX6yB0RHsow/5XYqIyJxS2MwhsyQCS8/Abn9EH9Ip\nIilFYTPHzIWr4bVX4ZWX/C5FRGTOKGzmmDnvYkhLx25/1O9SRETmjMJmjpncPDjzPOyOR7HOmN/l\niIjMCYWNDwIXvxf6e7BPPuJ3KSIic0Jh44dz3wUnnYr93jewh4b9rkZEJOEUNj4wgQCBj3wSerux\nP/svv8sREUk4hY1PzLIz4cx3Yn/yPezoqN/liIgklMLGR4FLamBwP+z8rd+liIgklMLGT2e+E0In\n4Dz+U78rERFJKIWNj0x6OuZdVfDMr7GD+/0uR0QkYRQ2PjOVl8LYGPZXv/C7FBGRhFHY+MyceBKc\nshz76EP6vDQRSVoKm3nAXPIXsPdVeP4Zv0sREUkIhc08YM6vhNwQzi9/5HcpIiIJobCZB0xGJubi\nS+HpJ7H7+/wuR0TEcwqbecK8+1JwHOxvHve7FBERzyls5glT+jYoK8f+WqceEJHko7CZR8z574YX\nn8f2dPldioiIpxQ284i5YBUA9jftPlciIuIthc08YopLoXwpdrvOcyMiyUVhM8+Yi94Dr0Sxf37R\n71JERDyTPtsbeOqpp2htbcVai7WWj3zkI6xcuZLOzk6ampoYGhoiFApRX19PSUkJQELmkoW5sAr7\nwFZs+08wHz3F73JERDwx65XNpk2buOaaa/jyl7/MNddcQ1NTEwDNzc3U1NSwceNGqqur2bx58/g2\niZhLFiaYiznvIuz2R3QWTxFJGrMOm0AgwIEDBwAYGhoiPz+fgYEBotEolZWVAFRWVhKNRhkcHEzI\nXLIx734fHIhhf/ek36WIiHhi1ofRrr32Wm677Tays7M5ePAgGzZsoLu7m3A4jDEGcAMpPz+fnp4e\nHMfxfC4UCh1VUywWIxaLxdVaXFw827s7N5adBYVLsO0/gQsv8bsaERG6uuL/JCMYDBIMBqe0/azC\nxnEcvvvd73LDDTdw2mmn8cILL3DHHXfQ0NAwm5udtW3bttHW1hY33traSiQS8aGi6dtf82EGvvFV\nigOW9JIT/S7nmBZKPxcK9dM76qW3Jtqvr1mzhrq6uiltP6uwefnll+nv7+e0004DYNmyZWRlZZGZ\nmUlvby/WWowxOI5DX18fBQUFWGs9n3ur2tpaqqqqJqy5o6NjNnd5ztizLgDz77z23W8SuGyd3+VM\nKBKJLJh+LgTqp3fUS29FIhE2bdoUNz7VVQ3M8jWbcDhMT0/P+H/qnj172L9/P6WlpZSXl9Pe7v5x\nYnt7OxUVFYRCIfLy8jyfm6gBxcXFcZeFxISL4Ix3YB//GdYZ87scEUlxE+1TpxM2xs7yjF3t7e08\n+OCDBAJubtXV1XH++efT0dFBU1MTsViMYDBIQ0MDpaWlAAmZm6qF9GzHPvUEzle/ROAzn8Ocd5Hf\n5cTRs0dvqZ/eUS+95cUhyVmHzUKzkB6AdmwM5/P/G/IWE9jw5fE3R8wX+oX2lvrpHfXSW16EjT5B\nYB4zaWmY6svhpRdg9x/9LkdEZMYUNvOcufhS9yyeD33H71JERGZMYTPPmawszCV/Ac/8GrvvNb/L\nERGZEYXNAmBW14Ax2Ed+7HcpIiIzorBZAEy4EM69EPv4T7Ajh/wuR0Rk2hQ2C0Sg6gMwNIj99WN+\nlyIiMm0Km4Vi+dlQciL20Yf8rkREZNoUNguEMQbz7mp48Xnsq3/2uxwRkWlR2Cwg5uL3Qlo6tv1h\nv0sREZkWhc0CYkInYM69EPurX2BHRvwuR0RkyhQ2C4xZXQ2xQezvfuV3KSIiU6awWWiWnwMFxdjH\ndChNRBYOhc0CYwIB97TRzz+D7er0uxwRkSlR2CxApvJSMAG9UUBEFgyFzQJk8gvg7POxT/xCJ1YT\nkQVBYbNAmQurYH8vvPAHv0sREZmUwmaBMmdfAFk5+vgaEVkQFDYLlMnKwrzjXdinHtff3IjIvKew\nWcDMhavhQAz+8JTfpYiIHJfCZiE7/Vw4IYzzi21+VyIiclwKmwXMpKVh3ncZ/PH32Oguv8sRETkm\nhc0CZy55PyzKxflhm9+liIgck8JmgTPZizDv/SA8/SS28xW/yxERmVD6bG9gZGSEe+65h2effZbM\nzEyWLl3K+vXr6ezspKmpiaGhIUKhEPX19ZSUlAAkZC6VmffWYn/8bezPf4BZ9xm/yxERiTPrlU1L\nSwuZmZnceeed3H777VxxxRUANDc3U1NTw8aNG6murmbz5s3j2yRiLpWZ0AmYC1djn/g59sCQ3+WI\niMSZVdgcPHiQxx57jLVr146P5eXlMTAwQDQapbKyEoDKykqi0SiDg4MJmRPcQ2mHhrHtP/W7FBGR\nOLM6jLZ3715yc3N54IEH2LlzJ9nZ2axdu5bMzEzC4TDGGAACgQD5+fn09PTgOI7nc6FQ6Ki6YrEY\nsVgsrt7i4uLZ3N15zbz9FFi6AvvLH2Iv/RAmoJfjRMQ7XV1dcWPBYJBgMDil7WcVNmNjY3R1dXHy\nySdz1VVXsXv3bm677Tauvfba2dzsrG3bto22tvh3Z7W2thKJRHyoaG7EPnQFvY3/REHva2Sfff6c\n/Mxk7qcf1E/vqJfeamhoiBtbs2YNdXV1U9p+VmFTVFREWloaF198MQCnnnoqeXl5ZGZm0tvbi7UW\nYwyO49DX10dBQQHWWs/n3qq2tpaqqqoJa+7o6JjNXZ7XbMXpkLOI7u/fT6Aw8b9okUgkqfs519RP\n76iX3opEImzatClufKqrGpjlazahUIgzzjiDZ555BnB35Pv37ycSiVBeXk57ezsA7e3tVFRUEAqF\nyMvL83xuogYUFxfHXZKdycrCXLAK+9QT2IMH/C5HRJLIRPvU6YSNsdba2RTQ1dXF3XffzeDgIOnp\n6Vx55ZWcc845dHR00NTURCwWIxgM0tDQQGlpKUBC5qYq2Z/t2Befx/nSP2A+Vk9g9fsT+rP07NFb\n6qd31EtveXFIctZhs9Ak+wPQWovzxb+D4YMEbvk3TFpawn6WfqG9pX56R730lhdho7csJRljDIEP\nXQldndgnf+l3OSIigMImOZ1zIZx0KvYH92FHR/2uRkREYZOMxlc33XuxOx71uxwREYVN0jrrfIi8\nHfuTB0mxl+VEZB5S2CQpYwym+nLY8zL88Wm/yxGRFKewSWJm5SVwQj7Oj7/jdykikuIUNknMZGS8\ncSbP55/xuxwRSWEKmyRn3lML4UKctq9hHcfvckQkRSlskpzJzMJctg7+ezf2qcf9LkdEUpTCJgWY\nd1VBWTn2O1/Hjoz4XY6IpCCFTQowgTQCf/XX7t/dPPIjv8sRkRSksEkVZ7wDTj8Hu+1+7IH4E8uJ\niCSSwiZFGGPc1c3QIPbH3/a7HBFJMQqbFGJOOgWz8hLsT7+P7e32uxwRSSEKmxRjLl8H1sF+/16/\nSxGRFKKwSTGmqATznlrsEz/H/vklv8sRkRShsElBpnYtBHNx7v8PfUiniMwJhU0KMsFczIfWwa4/\nwG9/5Xc5IpICFDYpyqx+P5x4Es59zXortIgknMImRZm0NAL/8xrY34f9zj1+lyMiSU5hk8JMxWmY\nS/8S+8iPsX/8vd/liEgSU9ikOHPZVVByIs5/bsTGBv0uR0SSlMImxZmsLAJXXweD+3G+3qR3p4lI\nQqR7dUMPPPAAbW1tNDY2UlZWRmdnJ01NTQwNDREKhaivr6ekpAQgIXMyc+akUzCXr8N++x7s4z/F\nvPt9fpckIknGk5VNNBpl9+7dFBYWjo81NzdTU1PDxo0bqa6uZvPmzQmdk9kx1R+GZWdh72vG7u3w\nuxwRSTKzDpvR0VG2bNnC1VdfPT42MDBANBqlsrISgMrKSqLRKIODgwmZk9kzgQCBT14Laek4/9GI\nHR31uyQRSSKzPox2//33s3r1aoqKisbHuru7CYfDGGMACAQC5Ofn09PTg+M4ns+FQqGjaorFYsRi\n8X87UlxcPNu7m9RMuJDAxxtwvvol7H/dh/nwVX6XJCLzRFdXV9xYMBgkGAxOaftZhc2uXbt48cUX\nWbdu3WxuxnPbtm2jra0tbry1tZVIJOJDRQtIZA29Lz5H7EcPkH/BReSsXHX8q6ufnlI/vaNeequh\noSFubM2aNdTV1U1p+1mFzXPPPUdHRwcNDQ1Ya+nt7eXWW2/l4x//OL29vVhrMcbgOA59fX0UFBSM\nX8/Lubeqra2lqqpqwpo7OvR6xGTsh9bBrufovvUfCFzzBcyKcye8XiQSUT89pH56R730ViQSYdOm\nTXHjU13VwCxfs7n88sv56le/yqZNm2hqaiIcDnPjjTdy0UUXUV5eTnt7OwDt7e1UVFQQCoXIy8vz\nfG6iBhQXF8ddZGpMdg6Bv7sJlkRw/u3/YV/9b79LEhGfTbRPnU7YGOvhH1Y0NDSwYcMGysrK6Ojo\noKmpiVgsRjAYpKGhgdLSUoCEzE2Vnu1Mne3vwfm/fw+ZWQRu/FdMMPeoeT179Jb66R310lteHJL0\nNGwWAj0Ap8fu/iPOv9wIFUvdQ2qL3ggc/UJ7S/30jnrpLS/CRp8gIMdlTj2dwKc+C9E/4fzLjdjB\nAb9LEpEFSGEjkzLvrCTQ8Hl47VWcu27BDh/0uyQRWWAUNjIl5szzCHzqOnh5N87d/6zAEZFpUdjI\nlJl3vAvzsb+B557Guf0fGevZ53dJIrJAKGxkWgKrqgnU3wiv7WHv3/819s8v+V2SiCwAChuZNnPO\nSgL/8CUAnC9vwHnou9hDwz5XJSLzmcJGZsS8/WSW3HEPLF2BbduK84W/wf73br/LEpF5SmEjM5YW\nLiTtb28icN2tADi3bcD52Q+0yhGROAobmTWz7CwCNzbCqadj79uMs+FqnF/+EOuM+V2aiMwTnp2p\nU1KbyVtM4NpbYNdOnO9/E3vvV7G//BHm0g9hLliNycryu0QR8ZFWNuIZYwxm2ZkErrsVs/56sBZ7\nz104N34a59GHsKMjfpcoIj7RykY8Z4zBXLAKe/674YVncR78BralCfvgNzArV2POWQlLV2DSM/wu\nVUTmiMJGEsYYA8vPJnDDbbDzdziPPYx95EfYn/0XZOXAinMwZ52POeudmMXx5yUSkeShsJGEM8bA\nmeeRduZ52IOvw/PPYJ99CvuH32B/9yQW4G0VmNPOdP8tK4fSt2Ey9TqPSLJQ2MicMtk5cO6FmHMv\nxFoLHX/GPvsbN3weewgOHXLDJy0dTlmGOWU5FJViiiOwOAwHX4eMDHcsQ4fhRBYKhY34xhgDJ56E\nOfEkqPkr963S+/bCnpex0V3YPz6NffhBGBsj7qRLJgAnvh1z0qkQOgFCJ2AKi6FgCYQLIWeRXhMS\nmUcUNjJvmEAaLInAkgjmnRcDYMfGoHcf7OvE7u/H5ORgh4eh8xVs9E/YPzwFsUEYHY0PpEW5UFoG\naWkwMuIG0KJcdxzAOm4wZWZDf4+7mgrlQe4JmNAJ7tfZiyA9HQ4Nw9gYZGa5l6zD/6alg+NAIOCG\np4hMSGEj85pJS4OiEigq4ciufKJduj0wBN1d0L0X29cDr8egvwf72qtgLeQE4fUYtmcfHBh6Y8PB\n/e6/mVlumIyNurc33UIzMiFvsXvJWQSjI+BYCBi34pFD0NcDWdlQciImI9MNwdw8d1tr6c8N4gwO\nunWMjrghlhtyrxNIg0DAvZjAW742h/9NwwQCYMzE133z3OHrv7Ht4bHMTHelaAIwNuLWkpGJyc5x\nPxmir8cN4Zwgxhis48Chg5CeoZWkHJfCRpKCWZQLb8+Ft588YRgdix0ednfsi4LuwOsHYGg/DA7A\n4H73DQ2jI5CVjUlLc3e4Ry7DwzA6CmkB97Wk/f3YgT736/QMdxzcFVTOIkzp27AHD8DeDuzYqLsj\nHxpwV11mIy/KAAAHcElEQVTAUCDghlx6urtiCgRgaHA8AKd0f6Zx36dlUa7bG+u436enuyE5fNAN\nRXDDMyvbXSlmZburv9FR6N7rhlh+IRw65Ib9gZgb8IvD7r/mcCAfOtzT9PQ3VpHjl0w30MzhAB//\njzbuWFqa2/eMDPpPWIyzf7/bu7ExcMbe+DpnERSXuu+IBPf/y3FDlSNPAl5/HV4fcueCIffS1+Pe\n18Jit8YDQ+7rh5lZ7n22dvx2TFa2O24d97pvflKQmQXZOW4dY2PQ2+XWUrjEHbeO+/gD97oHhty+\nLQq6l8wst5bXD7jBn5Vz+EmEgfRMTLq7W7djY+6TNXCfFIB7vcH9MNAHGUev0hP9ZEFhIynNZB3+\nZTviyC90sXvO9bcGVyIPlEUiETo6Oo4as47j7vCs4+7oHOforx3n8E7uLXPHuv5E1z38tXUsDL/u\nHpa01g289HQ4eNA9lJmbB0VL3IAcHHDDISvbDaLRETd4Dg279R4adk+wFwhgVpzrvvGjv8fdCS8K\nuivN4YPY/b1u2FrH3UlnZEFGuntY9EiojxyCgX73NkdH3Nrsm2LVWsDCmOPWMXKIQWfMXbmlHbmk\nv/F9bNDdUU9FRqb788ENCsMb4XocCQv9yZjAG2HY1+32OScH9veNr1LH789bpaW9EZyZme79LCgi\n7fp/9qQ0hY3IPGYCgTdWXYn+WXPyU+bGRMF9hLXWXTEeGgasu8IIpB1eWR1yVyfZiw6/ySTdXd3G\nhuCExe7OvK/b3WkHc92gHD7oHko8cmhy5JD7/aFhdyw9/eiQPxzI9uABMAFMuAiGX8f2dLnBboDQ\nYvff4WFYFMRkZmFfP+CucoYPwuICzKIgdrDfrdlaN7APxGBvhxscRSVu3a8fgPwwpGW4deUXYBYX\nuMF9ZIV+aPiNJwtHxtLS3Nc8PaKwEZGUYoxxDz+9VXbOxNfPzjl6rnDJG1+nZ7hhNZM6Jvl+sutP\nZZvp3l4izSpshoaGuOuuu+jq6iI9PZ2SkhLWr19PKBSis7OTpqYmhoaGCIVC1NfXU1JSApCQORER\nmb9m/UGcl112GXfccQe33347S5Ys4d577wWgubmZmpoaNm7cSHV1NZs3bx7fJhFzIiIyf80qbHJz\nc1mxYsX490uXLqW7u5uBgQGi0SiVlZUAVFZWEo1GGRwcTMiciIjMb569ZmOt5eGHH+aCCy6gu7ub\ncDg8/kdugUCA/Px8enp6cBzH87lQKOTV3RARkQTwLGy2bNlCTk4ONTU1vPTSS17d7IzEYjFisVjc\neHFxsQ/ViIgsfF1dXXFjwWCQYHBq75b0JGxaWlrYu3cvGzZsAKCwsJDe3l6stRhjcByHvr4+CgoK\nsNZ6PvdW27Zto62tLW68tbWVSCTixV2Ww9RPb6mf3lEvvdXQ0BA3tmbNGurq6qa0/azD5lvf+hbR\naJQNGzaQdvivVfPy8igvL6e9vZ1Vq1bR3t5ORUXF+OGuRMy9WW1tLVVVVUeN9fT0UFdXx6ZNm7TC\n8UBXVxcNDQ3qp0fUT++ol9460s+bb7457sn9VFc1MMuw2bNnDw8++CCRSITPf/7zgHuo6rrrruNT\nn/oUTU1NfPvb3yYYDB6ViomYe7PpLO1ERGRyBQUFswrvWYVNWVkZ999//4RzkUiEW2+9dc7mRERk\n/pr139mIiIhMRmEjIiIJl3bTTTfd5HcRcyUjI4MzzjiDzMxMv0tJCuqnt9RP76iX3vKin8Za69un\nYYuISGrQYTQREUk4hY2IiCRcSpzPRqcmmL36+noyMzPJyMjAGMO6des4++yz1dspaGlpYfv27ezb\nt4/GxkbKytwTUul0GjNzrH4e6zEK6uexJOI0McdkU8DNN99sH3vsMWuttY8++qi9+eabfa5o4amv\nr7evvPJK3Lh6O7nnn3/e9vT0xPXweL1TX4/tWP081mPUWvXzWAYHB+3OnTvHv29pabF33323tdb7\nx2fSH0bTqQm8YSd4H4l6OzXLli0jHA4f1UOdTmPmJuonTPwYBT1Oj8fr08QcT9IfRjve6Q50aoLp\n+cpXvoK1luXLl3PllVeqt7Mw09NwqK/H99bH6KJFi/Q4nSLrwWlijtfPpA8b8cYXv/hFwuEwo6Oj\nfO1rX2PLli3U1tb6XZbIuIkeo9dcc43fZS0YiT5NTNIfRnvz6Q6A456aQI4tHA4DkJ6eTnV1Nbt2\n7VJvZ+F4vVNfZ2aixyhoHzAVR04Tc+211wKJeXwmfdi8+XQHwHFPTSATGx4e5sCBA+PfP/7445SX\nl6u3M3DkF/R4vVNfp2+ix+hJJ50EaB8wmSOnibn++usnPE0MePP4TIlPEOjo6KCpqYlYLDZ+aoLS\n0lK/y1owurq6aGxsxHEcHMehrKyMT3ziEyxevFi9nYKtW7eyY8cO+vv7ycvLIzc3l8bGxuP2Tn09\nton6ecMNNxzzMQrq57Hs2bOHz372s0QiETIyMoA3ThPj9eMzJcJGRET8lfSH0URExH8KGxERSTiF\njYiIJJzCRkREEk5hIyIiCaewERGRhFPYiIhIwilsREQk4f4/cQH9SjrXo8QAAAAASUVORK5CYII=\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x2fa8e5bb4cd0\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "print(\"Inferred axes:\")\n",
        "print(qw_mean)\n",
        "print(\"Standard Deviation:\")\n",
        "print(qw_stddv)\n",
        "\n",
        "plt.plot(losses)\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 279
        },
        "colab_type": "code",
        "id": "CpSsruVIqAv5",
        "outputId": "58b5d2f7-c171-40c7-9f75-d76e9324bb94"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nAmPJZchA4zAAAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x2fa8e3b80990\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "posterior_samples = surrogate_posterior.sample(50)\n",
        "_, _, x_generated = model.sample(value=(posterior_samples))\n",
        "\n",
        "# It's a pain to plot all 5000 points for each of our 50 posterior samples, so\n",
        "# let's subsample to get the gist of the distribution.\n",
        "x_generated = tf.reshape(tf.transpose(x_generated, [1, 0, 2]), (2, -1))[:, ::47]\n",
        "\n",
        "plt.scatter(x_train[0, :], x_train[1, :], color='blue', alpha=0.1, label='Actual data')\n",
        "plt.scatter(x_generated[0, :], x_generated[1, :], color='red', alpha=0.1, label='Simulated data (VI)')\n",
        "plt.legend()\n",
        "plt.axis([-20, 20, -20, 20])\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "rWrL1mCNIcNy"
      },
      "source": [
        "## Acknowledgements\n",
        "\n",
        "This tutorial was originally written in Edward 1.0 ([source](https://github.com/blei-lab/edward/blob/master/notebooks/probabilistic_pca.ipynb)). We thank all contributors to writing and revising that version."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "ZJd8RbQxvyp6"
      },
      "source": [
        "#### References\n",
        "\n",
        "\u003ca name='1'\u003e\u003c/a\u003e[1]: Michael E. Tipping and Christopher M. Bishop. Probabilistic principal component analysis. _Journal of the Royal Statistical Society: Series B (Statistical Methodology)_, 61(3): 611-622, 1999."
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "name": "Probabilistic PCA",
      "private_outputs": false,
      "provenance": [],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
